package com.lcc.bank.tools.netty;

import com.lcc.bank.tools.handle.MsgHandleThread;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import lombok.extern.slf4j.Slf4j;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;

/**
 * @author lincc
 * @version 1.0  2019/2/22
 */
@Slf4j
public class NettyServerHandler extends ChannelInboundHandlerAdapter {
    /**
     *     设置最大得线程处理数量
     */
    private int threadsNums = 10;

    /**
     * 功能：读取服务器发送过来的信息
     */
    private ExecutorService pool = Executors.newFixedThreadPool(threadsNums);

    /**
     * channelAction channel 通道 action 活跃的
     * 当客户端主动链接服务端的链接后，这个通道就是活跃的了。也就是客户端与服务端建立了通信通道并且可以传输数据
     */
    @Override
    public void channelActive(ChannelHandlerContext ctx){
        log.info(ctx.channel().localAddress().toString() + " 通道已激活！");
    }

    /**
     *
     * channelInactive channel 通道 Inactive 不活跃的
     * 当客户端主动断开服务端的链接后，这个通道就是不活跃的。也就是说客户端与服务端的关闭了通信通道并且不可以传输数据
     */
    @Override
    public void channelInactive(ChannelHandlerContext ctx){
        log.info(ctx.channel().localAddress().toString() + " 通道关闭");
        // 关闭流
        ctx.close();
    }



    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg){
        // 第一种：接收字符串时的处理
        //创建一个具有固定线程数的线程池
        pool.execute(new MsgHandleThread(ctx, msg));
        int threadCount = ((ThreadPoolExecutor) pool).getActiveCount();
        log.info("当前线程数量：[{}]",threadCount);
    }

    /**
     * 功能：读取完毕客户端发送过来的数据之后的操作
     */
    @Override
    public void channelReadComplete(ChannelHandlerContext ctx){
        log.info("服务端接收数据完毕..");
    }

    /**
     * 功能：服务端发生异常的操作
     */
    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause){
        ctx.close();
        log.error("异常信息：" , cause);
    }
}
